PDA与CFG之间的转换

PDA与CFG之间的转换

 关于由PDA向CFG的构造

PDA与CFG的等价的,意味着对任意上下文无关文法(CFL),都相应地存在一个PDA接受它。而这个等价性证明对于大部分学生而言都是形式语言中能与图灵机(Turing Machian)构造相提并论的绝对难点之一。而这其中最让人难以理解的便是如何由PDA转换为相应的CFG。 “你可以先用两周的时间开明白它是怎么构造的,然后再花一个月的时间,你就会逐渐理解它为什么这么构造。” SDL讲这部分内容的时候如是说。这是我写这篇文章的动机。尽管下午两小时形式语言考试的结束意味着至少在相当一段时间里我不会再去研究相关的问题,可是在饱尝口授之苦之后,我觉得依然有必要把我对这部分的理解写下来,算是裨益后人吧。希望对看到它的人有所帮助。

 

首先是所构造的CFG中每个变元所表示的涵义:

形式:[qxp] 涵义:PDA中的状态q在pop(x)之后到达p状态

来源:PDA中的每个转移

生成式:以下将用例题来阐述生成式的构造方法以及其原理。

 

例:将PDA  P=({p, q}, {0, 1}, {X, Z}, δ, q, z) 转换为CFG,其中δ 为:

1: δ(q, 1, Z) = {(q, XZ)}  

2: δ(q, 1, X) = {(q, XX)}

3: δ(q, 0, X) = {(p, X)}

4: δ(q, ε, X) = {(q, ε)}

5: δ(p, 1, X) = {(p, ε)}

6: δ(p, 0, Z) = {(q, Z)}

 

OK,我们来开始构造:

令所要构造的CFG  G=(V, T, P, S)

首先看P接受哪些串。显然对它接受的串w, 都满足由初始状态(start state)读入串w之后达到empty stack。细心的人可能会发现P是以空栈方式接受的PDA,但聪明的人会更深一步去想,为什么转换成CFG的PDA必须是以空栈方式接受的,而不能是以终态方式接受的?

好了,既然如此,那么所构造的CFG应该有什么样的生成式呢?

很显然: S -> [qZq] | [qZp]  即每个生成式都是由PDA中的初始状态q通过一系列变换之后pop(Z)的结果,至于终态是什么,我们不知道,因为它是以空栈方式接受的,因此PDA中存在多少个状态,q将栈底元素pop之后就能到达多少个状态。

         接下来,我们将为每个转移过程构造相应的生成式:

1: δ(q, 1, Z) = {(q, XZ)}

由于我们所构造的CFG中的变元形式为[qxp], 它的涵义在上面已经讲过。而针对这个转移并不是执行pop操作,而是执行push操作。那我们应该怎么办呢?这是整个转换过程中最抽象的地方,也是最难理解的地方。 回想一下我们对start symbol的构造,我们最终是要将栈底元素Z弹出,而这个过程我们可以将它划分为n个子过程,即我们现在所看到的生成式。每个生成式都是一个pop的过程,最终所有的pop过程迭加起来便得到最终的空栈状态。这是为什么针对push操作(包括其他任何操作)我们都构造pop形式变元的原因。

 

对于该转移,我们得到的生成式是:

  1. [qZq] -> 1[qXq][qZq]
  2. [qZq] -> 1[qXp][pZq]
  3. [qZp] -> 1[qXq][qZp]
  4. [qZp] -> 1[qXp][pZp]

 

为什么是这样?

首先看->左边的变元,显然根据转移δ(q, 1, Z) = {(q, XZ)}我们知道这是一个push操作,因此q在pop栈底元素Z后我们不知道它会发生什么,同样的,它会转移到什么状态对于我们而言也是完全透明的,因此我们必须考虑进所有情况。

而它因何会生成->右边这种形式的生成式呢,我们来考虑一个例子:

比如说郭先生想从哈尔滨去广州看望故人,当然他可以选择直接从哈尔滨飞往广州,这也是最快的方法。而郭先生喜爱享受旅途的过程,于是他先从哈尔滨飞往大连,再由大连坐船至杭州,再由杭州乘火车至广州。从逻辑上讲(或者从形式上说)这两种方法显然是等价的。

好的,我们现在来考虑这个过程与我们所构造文法的内在关联。

第一个过程是郭先生直接从哈尔滨飞往广州。对,这就是->左边的变元涵义。由此说来右边生成式的涵义也容易理解了,郭先生身上原有Z元钱,从哈尔滨(状态q)乘飞机(读入1)至大连(状态q),这个过程中他往银行取了X元钱。再由大连坐船至杭州,花费X元钱([qXq],接着由杭州坐火车至广州,花费Z元钱([qZq],同时他的目的地也到达了。

想通了么?是不是忽然发现这个过程有点简单的匪夷所思?呵,everything is easy.

当然了,中间站是可以选择的,因此从大连出发,我可以去杭州,也可以去天津,南京等其他城市。

         有了这个描述过程,我想接下来的转换可以不必再详细解释了。

2: δ(q, 1, X) = {(q, XX)}

它的生成式如下:

  1. [qXq] -> 1[qXq][qXq]
  2. [qXq] -> 1[qXp][pXq]
  3. [qXp] -> 1[qXq][qXp]
  4. [qXp] -> 1[qXp][pXp]

 

3: δ(q, 0, X) = {(p, X)}

  1. [qXq] -> 0[pXq]
  2. [qXp] -> 0[pXp]

 

这里会有疑惑?想想郭先生为什么一定要途中经过两个城市再到广州呢?

明白了吧,我们继续。

4: δ(q, ε, X) = {(q, ε)}

 

[qXq] -> e

这是一个pop操作,因此不需要任何中介。

5: δ(p, 1, X) = {(p, ε)}

 

[pXp] -> 1

 

6: δ(p, 0, Z) = {(q, Z)}

  1. [pZq] -> 0[qZq]
  2. [pZp] -> 0[qZp]

原帖地址:http://blog.163.com/jiangfeng11_24/blog/static/2394027720081179330601/

  • 22
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值